home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #2 / Amiga Plus CD - 1995 - No. 2.iso / pd / grafik / mandelsquare-ham / iterate.asm < prev    next >
Assembly Source File  |  1995-04-11  |  3KB  |  158 lines

  1. ** Revision Header * Header built automatically - do not edit! *************
  2. *
  3. *    (C) Copyright 1991 by Olaf `Olsen' Barthel, all rights reserved
  4. *
  5. *    Name .....: Iterate.asm
  6. *    Created ..: Monday 26-Aug-91 11:20
  7. *    Revision .: 3
  8. *
  9. *    Date            Author          Comment
  10. *    =========       ========        ====================
  11. *    17-Sep-91    Olsen        Loop rearranged again
  12. *    12-Sep-91    Olsen        Loop rearranged for earlier termination
  13. *    26-Aug-91    Olsen        Created this file!
  14. *
  15. ****************************************************************************
  16.  
  17.     csect    text,0,0,1,2
  18.  
  19.     xdef    _Iterate
  20.  
  21. ;    BYTE Iterate(double RealValue,double ImaginaryValue);
  22. ;
  23. ;        Fast hand-coded '881 assembly language subroutine,
  24. ;    all arguments are passed on the stack since either SAS/C
  25. ;    fails to correctly pass them in registers or the register
  26. ;    values have to be converted to extended precision (hey, I
  27. ;    don't have an '881 users' manual here!).
  28. ;
  29. ;    Register usage is a follows:
  30. ;
  31. ;        d0    = MaxIterations
  32. ;        d1    = Iterations
  33. ;
  34. ;        fp0    = RealTemp
  35. ;        fp1    = ImaginaryTemp
  36. ;
  37. ;        fp2    = Real
  38. ;        fp3    = Imaginary
  39. ;
  40. ;        fp4    = RealValue
  41. ;        fp5    = ImaginaryValue
  42. ;
  43. ;        fp6    = Scratch
  44. ;        fp7    = 4.0
  45.  
  46. RealArg        equ    12*8+4
  47. ImaginaryArg    equ    RealArg+8
  48.  
  49. _Iterate:
  50.     fmovem.x fp0-fp7,-(sp)            ; Save registers
  51.  
  52.     fmove.d    RealArg(sp),fp4            ; RealValue
  53.     fmove.d    ImaginaryArg(sp),fp5        ; ImaginaryValue
  54.  
  55.     move.l    _MaxIteration(a4),d0        ; MaxIteration -> d0
  56.  
  57.     moveq    #0,d1                ; i = 0
  58.  
  59.     fmove.x    fp4,fp2                ; Real = RealValue
  60.     fmove.x    fp5,fp3                ; Imaginary = ImaginaryValue
  61.  
  62.     fmove.x    #4.0,fp7            ; FP7 = 4.0
  63.  
  64.     bra.b    Skip
  65.  
  66. Loop:    fadd.x    fp3,fp3                ; Imaginary *= 2
  67.     fmul.x    fp2,fp3                ; Imaginary *= Real
  68.     fadd.x    fp5,fp3                ; Imaginary += ImaginaryValue
  69.  
  70.     fmove.x    fp0,fp2                ; Real = RealTemp
  71.     fsub.x    fp1,fp2                ; Real -= ImaginaryTemp
  72.     fadd.x    fp4,fp2                ; Real += RealValue
  73.  
  74. Skip:    fmove.x    fp2,fp0                ; RealTemp = Real
  75.     fmove.x    fp3,fp1                ; ImaginaryTemp = Imaginary
  76.  
  77.     fmul.x    fp0,fp0                ; RealTemp = RealTemp^2
  78.     fmul.x    fp1,fp1                ; ImaginaryTemp = ImaginaryTemp^2
  79.  
  80.     fmove.x    fp0,fp6                ; RealTemp -> fp6
  81.     fadd.x    fp1,fp6                ; RealTemp += ImaginaryTemp
  82.     fabs.x    fp6,fp6                ; RealTemp = fabs(RealTemp)
  83.  
  84.     fcmp.x    fp7,fp6                ; RealTemp > 4?
  85.     fbgt.w    Exit                ; true -> break
  86.  
  87.     addq    #1,d1                ; Iterations++;
  88.     subq    #1,d0                ; Maximum number reached?
  89.     bgt.b    Loop                ; false -> Loop;
  90.  
  91.     fmovem.x (sp)+,fp0-fp7            ; Restore registers, return 0
  92.     rts
  93.  
  94. Exit:    move.l    _Wave(a4),a0            ; Get colour wave table
  95.     move.b    (a0,d1.w),d0            ; Get wave index, always > 0
  96.  
  97.     fmovem.x (sp)+,fp0-fp7            ; Restore registers
  98.     rts
  99.  
  100.     xdef    _Iterate2
  101.  
  102. _Iterate2:
  103.     fmovem.x fp0-fp7,-(sp)
  104.  
  105.     fmove.d    RealArg(sp),fp4
  106.     fmove.d    ImaginaryArg(sp),fp5
  107.  
  108.     move.l    _MaxIteration(a4),d0
  109.  
  110.     moveq    #1,d1
  111.  
  112.     fmove.x    fp4,fp2
  113.     fmove.x    fp5,fp3
  114.  
  115.     fmove.x    #4.0,fp7
  116.  
  117.     bra.b    Skip2
  118.  
  119. Loop2:    fadd.x    fp3,fp3
  120.     fmul.x    fp2,fp3
  121.     fadd.x    fp5,fp3
  122.  
  123.     fmove.x    fp0,fp2
  124.     fsub.x    fp1,fp2
  125.     fadd.x    fp4,fp2
  126.  
  127. Skip2:    fmove.x    fp2,fp0
  128.     fmove.x    fp3,fp1
  129.  
  130.     fmul.x    fp0,fp0
  131.     fmul.x    fp1,fp1
  132.  
  133.     fmove.x    fp0,fp6
  134.     fadd.x    fp1,fp6
  135.     fabs.x    fp6,fp6
  136.  
  137.     fcmp.x    fp7,fp6
  138.     fbgt.w    Exit2
  139.  
  140.     addq    #1,d1
  141.     subq    #1,d0
  142.     bgt.b    Loop2
  143.  
  144.     fmovem.x (sp)+,fp0-fp7
  145.     rts
  146.  
  147. Exit2:    move    d1,d0
  148.  
  149.     fmovem.x (sp)+,fp0-fp7
  150.     rts
  151.  
  152.     section    __MERGED,data
  153.  
  154.     xref    _Wave
  155.     xref    _MaxIteration
  156.  
  157.     end
  158.